上個月看到 Cloudflare 發布了一關於速度週的文章,雖然看起來像是 Cloudflare 廣告自己的產品用的,我細讀後才發現,他詳細了說明了現在在上網時為何會有的網頁可以很快,有的網頁卻慢的跟烏龜一樣,詳細說明網路會遇到的一些困境和原理 (單然解法就是用他們家的產品),在技術方面值得一讀,我就稍微統整一下。
No one likes to wait. Internet impatience is something we all suffer from.
文章一開頭就用一句點出大家在上網時會遇到的狀況,沒有人喜歡等待,可是所有人都在上網時身受其害,相信大家都遇過下面的情況:
- 等待 App 完成內容更新
- 等待網頁出現
- 等待電影開始播放
但有寫過程式或服務的都知道,人一多,就一定慢,非常的難避免,所以這時候就要用 Cloudflare,這時又宣傳了一下 Cloudflare。
許多使用者家裡都會覺得網路很慢,然後買了很快很快的網速,像是 100Mbpa, 1Gbps 甚至 2Gbps,但其實就算家裡的網路再怎麼快,你連線的 Server 就是很慢,你的上網體驗還是大打折扣。
如果要讓自己的服務不卡,只需要完成下面三樣要求:
- Server 有充足的帶寬
- 讓 Server 盡量接近 User
- 讓你的 Web 或 App 盡量得快
看起來很簡單,但如果要完成這三個要求,都會耗費極大的成本。
DNS
現今的網路世界主要是由 ipv4 組成,也就是說,如果沒有 ipv4 地址,所有的網路連線都不會發生,如果我只知道 www.fcu.edu.tw,是完全沒有辦法上網的,因為我並不知道這個網址對應的 ip 是多少 (像是 140.134.xxx.xxx),就完全沒有辦法和伺服器產生連線。DNS 出現前,大家都是直接用 ip 溝通,快速方便,最大的缺點就是非常難記。所以 DNS 就出現了,DNS 就像你打電話會需要電話簿一樣,我只我需要一個簡單好記的名字,再去電話簿搜尋真正的電話號碼就好。
在知道電話號碼前,所有網路連線都不會發生,所以用最快速的方式查找電話簿絕對是上網速度最重要的一環,如果光是要知道 ip 位置就花掉 50ms(甚至更多),上網效率就會大大降低。如今網路上有許多的 DNS 提供商,為大家記下這龐大的 DNS 電話簿,最著名的就是 Google 的 8.8.8.8,和 Cloudflare 的 1.1.1.1,Cloudflare 宣稱他是全世界最快的 DNS 提供商,(雖然在台灣好像未必),但 Cloudflare 承諾他不會紀錄使用者查過的 DNS 紀錄,或上過什麼網頁 (好像是在暗示競爭對手會這麼做)。
另外,就算 DNS 伺服器完全不假思索 (沒有反應時間) 就回傳 DNS 的查詢結果,這也付出了至少一個光速的代價,聽起來好像沒什麼影響,但可以看看下面簡單的計算。
光速損耗
假設我家和 DNS 伺服器之間的直線距離是 100 公里,而且中華電信筆直的連接了一條筆直光纖到 DNS 伺服器,而光在光纖中的速度是 200,000,000 公尺/秒,往返需要 200,000 公尺。經過這樣簡單的計算,光是光速就已經耗費整整 1 毫秒(ms),可以試著想想看更糟的情況,光速已經開始在嚴重拖累網速。
Hello Hello OK
知道了 ip 後,瀏覽器終於可以連上目標伺服器取得網頁,不久後就可以看到網頁出現在眼前。
上面的步驟,幾乎都是由 TCP 協定完成,協定的第一步就是你的電腦和伺服器互相同意連線,這個過程稱作三向交握 (Three-Way Handshake),步驟如下:
- Client 對 Server 說:Hello
- Server 對 Client 說:我聽到你說 Hello
- Client 對 Server 說:我聽到 -- 你說你聽到我說 Hello,我們現在可以溝通了。
從上面的步驟就可以發現,已經至少耗費了一個光速的時間,所以也是一樣,伺服器愈靠近用戶,網速就愈快。這也是為什麼 Cloudflare 在世界各地廣設伺服器。
TLS/SSL
有了 TCP 我們就可以安全的連線了嗎?當然不是,TCP 一點也不安全,現在的網路連線幾乎都是透過 TLS (或稱作 SSL) 加密連線,所以 TCP 連線後,下一步是建立安全的加密連線。
TLS 是一個非常複雜的加密協定,會牽涉到下面的設備:網路瀏覽器、建立鑰匙的伺服器,而且還要有一個可以證明他的身分的伺服器,因為不會想要和銀行建立安全連線,但你根本不確定他是不是你的銀行。
上面的步驟也會需要好幾次光速損耗,所以讓伺服器愈靠近用戶端愈好。另外,也要盡量使用最新的 TLS 標準 (現在是 TLS 1.3)。
後記
我覺得這篇文章最有趣的的部分就是一直在討論光速對網路連線的影響,以往我都覺得光速很快,但光就算很快,光也是要跑很長一段距離,這樣耗損來回個幾次就已經對網路連線產生極大的影響了,而且更何況一個連線就一定會需要來回溝通好幾次。這篇文章後面還有蠻多內容,但我覺得沒有那麼重要就懶得寫了,有興趣的話可以自己繼續往下看。